#include "key/key.h"
#include "led/led.h"
#include "beep/beep.h"

/**
 * @brief       按键扫描函数
 * @note        该函数有响应优先级(同时按下多个按键): WKUP > KEY1 > KEY0!
 * @param       mode:0 / 1, 具体含义如下:
 *   @arg       0,  不支持连续按(当按键按下不放时, 只有第一次调用会返回键值,
 *                  必须松开以后, 再次按下才会返回其他键值)
 *   @arg       1,  支持连续按(当按键按下不放时, 每次调用该函数都会返回键值)
 * @retval      键值, 定义如下:
 *              KEY0_PRES, 1, KEY0按下
 *              KEY1_PRES, 2, KEY1按下
 *              WKUP_PRES, 3, WKUP按下
 */
uint8_t key_scan(uint8_t mode)
{
    static uint8_t key_up = 1;  /* 按键按松开标志 */
    uint8_t keyval = 0;

    if (mode) key_up = 1;   	/* 支持连按 */

    if (key_up && (KEY0 == 0 || KEY1 == 0 || WKUP == 1))   /* 按键松开标志为1, 且有任意一个按键按下了 */
    {
    	HAL_Delay(10);       		/* 去抖动，后面会换成高精度延时函数！ */
        key_up = 0;

        if (KEY0 == 0)  keyval = KEY0_PRES;

        if (KEY1 == 0)  keyval = KEY1_PRES;

        if (WKUP == 1) keyval = WKUP_PRES;
    }
    else if (KEY0 == 1 && KEY1 == 1 && WKUP == 0)  /* 没有任何按键按下, 标记按键松开 */
    {
        key_up = 1;
    }

    return keyval;  /* 返回键值 */
}



void delay_short(volatile unsigned int n)
{
	while(n--){}
}
void delay(volatile unsigned int n)
{
	while(n--)
	{
		delay_short(0x7fff);
	}
}

/**
 * @brief       GPIO上升沿回调函数
 * @param       GPIO_Pin: 中断引脚号
 * @note        在HAL库中所有的外部中断服务函数都会调用此函数
 * @retval      无
 */
void HAL_GPIO_EXTI_Rising_Callback(uint16_t GPIO_Pin)
{
    /** 消抖，此处为了方便，使用了延时函数，实际代码中禁止
	 *在中断服务函数中调用任何HAL_Delay之类的延时函数！！！
	 */
	HAL_Delay(10);
	//for(long i = 1;i<72000;i++){}; //消除抖动
	//delay(2);
    if (WKUP == 1)        	/* WK_UP中断  */
    {
		BEEP_TOGGLE();/* 蜂鸣器 状态取反  */
    }
}

/**
 * @brief       GPIO下降沿回调函
 * @param       GPIO_Pin: 中断引脚
 * @note        在HAL库中所有的外部中断服务函数都会调用此函数
 * @retval      无
 */
void HAL_GPIO_EXTI_Falling_Callback(uint16_t GPIO_Pin)
{
    /** 消抖，此处为了方便，使用了延时函数，实际代码中禁止
	 *在中断服务函数中调用任何HAL_Delay之类的延时函数！！！
	 */
	HAL_Delay(10);
	//for(long i = 1;i<72000;i++){}; //消除抖动
	//delay(2);
    if (KEY0 == 0)         	/* KEY0中断 */
    {
    	LED0_TOGGLE();	  	/* LED0状态取反 */
    }
	else if(KEY1 == 0)		/* KEY1中断 */
	{
		LED1_TOGGLE();/*  LED01状态取反 */
	}
}

